package com.ruoyi.file.service;

import com.obs.services.model.PartEtag;
import com.ruoyi.file.domain.MergeFileParams;
import com.ruoyi.system.api.params.UploadChunkParams;
import com.ruoyi.system.api.params.UploadFileParams;
import com.ruoyi.system.api.vo.UploadFileVO;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.rmi.ServerException;

/**
 * 华为云对象存储服务
 *
 * @author ZhangYu
 */
public interface IHuaWeiObsService {

    /**
     * 文件上传接口
     *
     * @param uploadFileParams 上传的文件
     * @return 访问地址
     */
    String uploadFile(UploadFileParams uploadFileParams) throws Exception;

    /**
     * 文件上传接口
     *
     * @param uploadFileParams 上传的文件
     * @return 访问地址
     */
    String huaweiShardingUpload(UploadFileParams uploadFileParams) throws IOException;

    /**
     * 获取上传组id
     *
     * @param biz              文件上传前缀
     * @param originalFilename 文件名
     * @return 上传文件信息
     */
    UploadFileVO getUploadId(String biz, @NotNull String originalFilename) throws ServerException;

    /**
     * 上传分片
     * 需要指定uploadId，同时我们要将返回的分片信息PartETag序列化保存数据库，用于后续的文件合并
     *
     * @param uploadChunkParams 分片上传参数
     * @return 分片信息
     */
    PartEtag uploadChunk(UploadChunkParams uploadChunkParams) throws ServerException;

    /**
     * 合并分片
     * 通过传递保存分片的PartETag对象数组进行操作，为了附件独立唯一性我们不直接使用合并后的文件，通过api进行文件拷贝副本使用
     *
     * @param mergeFileParams 分片上传参数
     * @return 文件地址
     */
    String mergeFile(MergeFileParams mergeFileParams) throws ServerException;

}
